package net.jimblackler.yourphotoswatch;
import android.accounts.AccountManager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.JsonReader;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.GooglePlayServicesAvailabilityException;
import com.google.android.gms.auth.UserRecoverableAuthException;
import com.google.android.gms.common.AccountPicker;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import net.jimblackler.yourphotoswatch.ReaderUtil.ReaderException;
public class PicasaSelectActivity extends BasePhotoSelectActivity {
static final int REQUEST_CODE_PICK_ACCOUNT = 1;
static final int REQUEST_CODE_REQUEST_AUTHORIZATION = 2;
@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
if (resultCode == RESULT_CANCELED)
finish();
if (resultCode != RESULT_OK)
return;
switch (requestCode) {
case REQUEST_CODE_PICK_ACCOUNT:
case REQUEST_CODE_REQUEST_AUTHORIZATION:
String email = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
SharedPreferences settings =
PreferenceManager.getDefaultSharedPreferences(PicasaSelectActivity.this);
Editor editor = settings.edit();
editor.putString("email", email);
editor.commit();
authenticateFromEmailAndFetch();
break;
}
}
private void authenticateFromEmailAndFetch() {
final SharedPreferences settings =
PreferenceManager.getDefaultSharedPreferences(PicasaSelectActivity.this);
final String email = settings.getString("email", "");
if (email.equals("")) {
String[] accountTypes = new String[]{"com.google"};
Intent intent = AccountPicker.newChooseAccountIntent(null, null,
accountTypes, false, null, null, null, null);
startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);
return;
}
if (PreferenceManager.getDefaultSharedPreferences(this).contains("token")) {
fetchPhotos();
return;
}
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
try {
Editor editor;
String scope = "oauth2:https://picasaweb.google.com/data/";
String token = GoogleAuthUtil.getToken(PicasaSelectActivity.this, email, scope);
editor = settings.edit();
editor.putString("token", token);
editor.commit();
fetchPhotos();
} catch (UserRecoverableAuthException e) {
startActivityForResult(e.getIntent(), REQUEST_CODE_REQUEST_AUTHORIZATION);
} catch (GoogleAuthException | IOException e) {
e.printStackTrace();
finish();
}
return null;
}
}.execute();
}
protected void fetchPhotos() {
final SharedPreferences settings =
PreferenceManager.getDefaultSharedPreferences(PicasaSelectActivity.this);
final String email = settings.getString("email", "");
String feed = "https://picasaweb.google.com/data/feed/api/user/" + email + "?kind=photo&max-results=5000&alt=json&fields=entry(published,title,media:group(media:title,media:content))";
runOnUiThread(new Runnable(){
@Override
public void run() {
findViewById(R.id.progress).setVisibility(View.VISIBLE);
}
});
new AsyncTask<String, Void, List<? extends PhotoListEntry>>() {
@Override
protected List<? extends PhotoListEntry> doInBackground(String... params) {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(params[0]).openConnection();
String token = PreferenceManager.getDefaultSharedPreferences(PicasaSelectActivity.this).
getString("token", "");
connection.setRequestProperty("Authorization", "Bearer " + token);
connection.connect();
int code = connection.getResponseCode();
if (code == HttpURLConnection.HTTP_UNAUTHORIZED ||
code == HttpURLConnection.HTTP_FORBIDDEN) {
// Token cleared and forgotten.
Editor editor = settings.edit();
editor.remove("token");
editor.commit();
GoogleAuthUtil.clearToken(PicasaSelectActivity.this, token);
authenticateFromEmailAndFetch();
return null;
}
final List<PicasaPhotoListEntry> entries = new ArrayList<>();
final InputStream inputStream = connection.getInputStream();
JsonReader reader = new JsonReader(new InputStreamReader(inputStream));
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
switch (name) {
case "feed":
reader.beginObject();
while (reader.hasNext()) {
name = reader.nextName();
switch (name) {
case "entry":
reader.beginArray();
while (reader.hasNext()) {
PicasaPhotoListEntry entry =
new PicasaPhotoListEntry(reader, entries.size());
if (entry.isValid())
entries.add(entry);
}
reader.endArray();
break;
default:
reader.skipValue();
}
}
reader.endObject();
break;
default:
reader.skipValue();
}
}
reader.endObject();
final int sortOrder = getIntent().getIntExtra("sort", R.id.oldest_first);
Collections.sort(entries, new Comparator<PicasaPhotoListEntry>() {
@Override
public int compare(PicasaPhotoListEntry lhs, PicasaPhotoListEntry rhs) {
if (sortOrder == R.id.oldest_first)
return lhs.getPublishDate().compareTo(rhs.getPublishDate());
else
return rhs.getPublishDate().compareTo(lhs.getPublishDate());
}
});
return entries;
} catch (IOException | GoogleAuthException | ReaderException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(List<? extends PhotoListEntry> entries) {
setEntries(entries);
}
}.execute(feed);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.photo_select_activity);
setEntries(new ArrayList<PhotoListEntry>());
authenticateFromEmailAndFetch();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!super.onCreateOptionsMenu(menu))
return false;
menu.add(R.string.picasa_logout).setOnMenuItemClickListener(
new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
new AsyncTask<Void, Void, Void>(){
@Override
protected Void doInBackground(Void... params) {
SharedPreferences settings =
PreferenceManager.getDefaultSharedPreferences(PicasaSelectActivity.this);
try {
Editor editor = settings.edit();
if (settings.contains("token")) {
editor.remove("token");
GoogleAuthUtil.clearToken(PicasaSelectActivity.this, settings.getString("token", ""));
}
if (settings.contains("email")) {
editor.remove("email");
}
editor.commit();
} catch (IOException | GoogleAuthException e) {
e.printStackTrace();
}
finish();
return null;
}
}.execute();
return true;
}
});
return true;
}
}